home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
String.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-08
|
5KB
|
247 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "String.h"
#include "Error.h"
extern "C" void bcopy(const void *, void *, size_t);
void MemCpy(void *to, const void *from, size_t len)
{
bcopy(from, to, len);
}
void *memcpy(void *to, const void *from, size_t len)
{
if (to == 0 && len != 0)
fprintf(stderr, "memcpy, to == 0\n");
if (from == 0 && len != 0)
fprintf(stderr, "memcpy, from == 0\n");
bcopy(from, to, len);
return to;
}
int StuffChar(char *src, char *dst, int dstlen, char* specchars, char stuffchar)
{
register char *p, *q, *end;
end= dst+dstlen-1;
for (p= src, q= dst; *p && q < end; ) {
if (strchr(specchars, *p)) {
*q++= stuffchar;
if (q < end)
*q++= *p++;
} else
*q++= *p++;
}
*q= '\0';
if (*p != 0)
return -1;
return q-dst;
}
char *strsave(char *s, int l)
{
if (s == 0 || l == 0)
return 0;
if (l < 0)
l= strlen(s)+1;
char *str= new char[l];
return strncpy(str, s, l);
}
char *strreplace(char **s, char *r, int l)
{
if (s == 0)
Fatal("strreplace", "s == 0, replace: %s l: %d", r, l);
if (r == 0 || l == 0)
return *s;
if (l < 0)
l= strlen(r)+1;
*s= (char*) Realloc(*s, l);
return strncpy(*s, r, l);
}
char *strfreplace(char **s, char *fmt, va_list ap)
{
char buf[1000];
if (s == 0)
Fatal("strfreplace", "s == 0, fmt: %s", fmt);
if (fmt == 0)
return *s;
vsprintf(buf, fmt, ap);
*s= (char*) Realloc(*s, strlen(buf)+1);
return strcpy(*s, buf);
}
char *strprintf(char *va_(fmt), ...)
{
va_list ap;
char buf[2000];
va_start(ap,va_(fmt));
vsprintf(buf, va_(fmt), ap);
va_end(ap);
return strsave(buf);
}
char* strvprintf(char* fmt, va_list ap)
{
char buf[2000];
vsprintf(buf, fmt, ap);
return strsave(buf);
}
bool strismember(const char *va_(cp), ...)
{
char *s;
va_list ap;
bool found= FALSE;
va_start(ap,va_(cp));
for (int i= 0; s= va_arg(ap, char*); i++)
if (strcmp(va_(cp), s) == 0) {
found= TRUE;
break;
}
va_end(ap);
return found;
}
char* strn0cpy(char *dst, const char *src, int l)
{
strncpy(dst, src, l-1);
dst[l-1]= '\0';
return dst;
}
u_long strhash(const byte *str)
{
register u_long h= 0, g;
register const byte *p= str;
while (*p != 0) {
h= (h << 4) + *p++;
if ((g= h & 0xf0000000) != 0)
h= (h ^ (g >> 24)) ^ g;
}
return h;
}
char *strquotechar(byte ch, char *q)
{
switch(ch) {
case '\n':
*q++='\\'; *q++='n';
break;
case '\r':
*q++='\\'; *q++='r';
break;
case '\0':
*q++='\\'; *q++='0';
break;
case '\t':
*q++='\\'; *q++='t';
break;
case '\v':
*q++='\\'; *q++='v';
break;
case '\f':
*q++='\\'; *q++='f';
break;
case '\b':
*q++='\\'; *q++='b';
break;
default:
if (Isascii(ch) && Isprint(ch)) {
*q++= ch;
} else {
*q++= '\\';
*q++= 'x';
*q++= hexChars[ch/16];
*q++= hexChars[ch%16];
}
}
return q;
}
char *BaseName(char *name)
{
if (name) {
if (name[0] == '/' && name[1] == '\0')
return name;
char *cp;
if (cp= strrchr(name, '/'))
return ++cp;
return name;
}
return "Error in String::BaseName";
}
int StrCmp(register byte *s1, register byte *s2, int n, register byte *map)
{
if (map) {
if (n < 0) {
while (map[(byte)*s1] == map[(byte)*s2++])
if (map[(byte)*s1++] == '\0')
return 0;
return map[(byte)*s1] - map[(byte)*--s2];
} else {
while (--n >= 0 && map[(byte)*s1] == map[(byte)*s2++])
if (map[(byte)*s1++] == '\0')
return 0;
return (n < 0) ? 0 : map[(byte)*s1] - map[(byte)*--s2];
}
} else {
if (n < 0) {
while (*s1 == *s2++)
if (*s1++ == '\0')
return 0;
return (int)*s1 - (int)*--s2;
} else {
while (--n >= 0 && *s1 == *s2++)
if (*s1++ == '\0')
return 0;
return (n < 0) ? 0 : (int)*s1 - (int)*--s2;
}
}
}
const cb_size= 1024;
const fld_size= 512;
// a circular formating buffer
static char formbuf[cb_size]; // some slob for form overflow
static char* bfree= formbuf;
static char* endbuf= &formbuf[cb_size-1];
char* form(const char* va_(fmt), ...)
{
va_list ap;
va_start(ap,va_(fmt));
char *format= (char*) va_(fmt);
register char *buf= bfree;
if (buf+fld_size > endbuf)
buf= formbuf;
register int ll= (int) vsprintf(buf, format, ap);
if (0 < ll && ll < cb_size) // length
;
else if (buf < (char*)ll && (char*)ll < buf+cb_size) // pointer to trailing 0
ll= (char*)ll - buf;
else
ll= strlen(buf);
if (fld_size < ll) // oops
Fatal("form", "buffer overflow");
bfree= buf+ll+1;
va_end(ap);
return buf;
}